Thread Pool Manager?

Otázka od: Milan Cizek

31. 8. 2002 18:20

Ahoj,
nejsem si jisty, jestli jsem v subjektu spravne vystihl svuj problem -
tusim, ze se tomu tak nejak rika.   Jde mi o nasledujici: mam objekt
(odvozena od TThread), ktera se dotazuje do internetu a zpracovava vracene
udaje. Abych zbytecne neprodelaval na timeoutech, chtel bych v programu
urcit pocet vlaken, ktera budou pracovat soubezne. Jeste dodam, ze .execute
te funkce konci az pri zavolani Terminate.

Muj pokus je zatim nasledujici: vytvoril jsem si dalsi objekt
(TThreadManager), kteremu nastavim vsechny potrebne udaje. Zdrojova data
nacitam z DB, coz jsem osetril kritickou sekci. Nevim, jak v tomto pripade
pristoupit z TChecker k parametrum TThreadManager (FProxyServer), nerad bzch
to resil globalni promenou nebo opetovnym predavanim v konstruktoru. Neco
takoveho delam poprve... Pokud program ukoncim beznym zpusobem, vola se
destruktor TThreadManageru? Nebo musim volat destroy v OnClose formulare? Ci
snad zcela jine reseni? Diky.

  TChecker = class(TThread)
  protected
    { Protected declarations }
    procedure Display;
    procedure Execute; override;
  public
    { Public declarations }
    FURL: string;
    FProxyServer: TProxyParams;
    FStatusCode: integer;
    procedure Error;
    procedure CheckURL;
    constructor Create;
  end;

  TThreadManager = class(TObject)
  protected
    { Protected declarations }
    FThreads: array of TChecker;
    FSection: TRTLCriticalSection;
  public
    { Public declarations }
    FProxyServer: TProxyParams;
    constructor Create(Threads: integer);
    destructor Destroy; override;
  end;

constructor TThreadManager.Create(Threads: integer);
var Count: integer;
begin
  InitializeCriticalSection(FSection);

  SetLength(FThreads,Threads);
  for Count:=0 to Threads-1 do FThreads[Count]:=TChecker.Create;
end;

destructor TThreadManager.Destroy;
var Count: integer;
begin
  for Count:=Low(FThreads) to High(FThreads) do FThreads[Count].Terminate;
  DeleteCriticalSection(FSection);
end;
...

begin
  TThreadManager.Create(8);
end;

S pozdravem Milan Cizek, amatersky programator, D6.02 Ent
Win2k (SP2) a WinXP, cizek.milan@seznam.cz, ICQ: 59826637